//
// Created by Jisam on 30/09/2024 3:54 PM.
// Solution of  聪明的质监员
// 2024-09-30 16:10:47 AC 100 前缀和 + 二分答案
#include <bits/stdc++.h>

#define int long long
#define endl "\n"
using namespace std;

const int MAXN = 200000 + 5;
int n, m, s;
int w[MAXN], v[MAXN], lf[MAXN], rt[MAXN], pv[MAXN], pn[MAXN];
int r, l = INT_MAX; // 定义变量r（最大重量），l（最小重量），初始l为INT_MAX
int ans = LONG_LONG_MAX, sum; // 定义变量ans（最小差值），sum（当前总价值）

// 检查给定重量阈值x是否满足条件的函数
bool check(int x) {
    memset(pv, 0, sizeof pv); // 初始化pv数组
    memset(pn, 0, sizeof pn); // 初始化pn数组
    for (int i = 1; i <= n; i++) {
        if (w[i] >= x) { // 如果当前项目的重量大于等于给定的重量x
            pv[i] = pv[i - 1] + v[i]; // 更新累积价值
            pn[i] = pn[i - 1] + 1; // 更新累积数量
        } else {
            pv[i] = pv[i - 1]; // 如果当前项目的重量小于给定的重量x，累积价值不变
            pn[i] = pn[i - 1]; // 累积数量不变
        }
    }
    int y = 0; // 用于存储当前总价值
    for (int i = 1; i <= m; i++) // 遍历所有区间
        y += (pn[rt[i]] - pn[lf[i] - 1]) * (pv[rt[i]] - pv[lf[i] - 1]); // 计算区间的价值并累加
    sum = abs(y - s); // 计算当前总价值与目标值的差值
    if (y > s) return true; // 如果当前总价值超过目标值，返回true
    return false; // 否则返回false
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    cin >> n >> m >> s; // 输入物品数量，区间数量，目标价值
    for (int i = 1; i <= n; i++) {
        cin >> w[i] >> v[i]; // 输入每个物品的重量和价值
        r = max(r, w[i]); // 更新最大重量
        l = min(l, w[i]); // 更新最小重量
    }

    for (int i = 1; i <= m; i++) {
        cin >> lf[i] >> rt[i]; // 输入每个区间的左端点和右端点
    }
    l--, r += 2; // 调整搜索范围
    // 二分查找
    int left = l, right = r;
    while (left + 1 < right) {
        int mid = (left + right) / 2;
        (check(mid) ? left : right) = mid;
        ans = min(ans, sum);
    }
    ans = min(ans, sum); // 最后一次更新最小差值
    cout << ans << endl; // 输出最小差值
    return 0;
}